package at.codejedi.sto.gui.detail.chart;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.GridLayout;
import java.util.List;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LayeredBarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class BattleBarChart extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3978821451478860798L;

	private static JFreeChart createChart(CategoryDataset dataset, String title) {

		// create the chart...
		JFreeChart chart = ChartFactory.createBarChart(title, // chart title
				"Battle", // domain axis label
				"Damage", // range axis label
				dataset, // data
				PlotOrientation.VERTICAL, // orientation
				true, // include legend
				true, // tooltips?
				false // URLs?
				);

		// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...

		// set the background color for the chart...
		chart.setBackgroundPaint(Color.white);

		// get a reference to the plot for further customisation...
		CategoryPlot plot = chart.getCategoryPlot();
		plot.setBackgroundPaint(Color.lightGray);
		plot.setDomainGridlinePaint(Color.white);
		plot.setDomainGridlinesVisible(true);
		plot.setRangeGridlinePaint(Color.white);
		plot.setRenderer(new LayeredBarRenderer());

		// set the range axis to display integers only...
		final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
		rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

		// disable bar outlines...
		BarRenderer renderer = (BarRenderer) plot.getRenderer();
		renderer.setDrawBarOutline(false);

		// set up gradient paints for series...
		GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.blue, 0.0f,
				0.0f, new Color(0, 0, 64));
		GradientPaint gp1 = new GradientPaint(0.0f, 0.0f, Color.green, 0.0f,
				0.0f, new Color(0, 64, 0));
		renderer.setSeriesPaint(0, gp0);
		renderer.setSeriesPaint(1, gp1);

		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setCategoryLabelPositions(CategoryLabelPositions
				.createUpRotationLabelPositions(Math.PI / 6.0));
		// OPTIONAL CUSTOMISATION COMPLETED.

		return chart;

	}

	private static CategoryDataset createDataset(List<BattleBarChartData> data) {

		// column keys...
		String dealtName = "dealt";
		String receivedName = "received";

		// create the dataset...
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();

		for (BattleBarChartData battleData : data) {

			String categoryName = battleData.name;
			dataset.addValue(battleData.dealt, dealtName, categoryName);
			dataset.addValue(battleData.received, receivedName, categoryName);

		}

		return dataset;

	}

	private String title;

	public BattleBarChart(String title) {
		this.title = title;

	}

	public void init(List<BattleBarChartData> data) {
		CategoryDataset dataset = createDataset(data);
		JFreeChart chart = createChart(dataset, title);
		ChartPanel chartPanel = new ChartPanel(chart, false);
		chartPanel.setPreferredSize(new Dimension(500, 270));
		setLayout(new GridLayout(1, 1));
		add(chartPanel);
	}

}
